/*
 * Formulario.h
 *
 *  Created on: Nov 17, 2013
 *      Author: damian
 */

#ifndef FORMULARIO_H_
#define FORMULARIO_H_

#include <string>
#include <vector>
#include <map>
#include <iostream>
#include "../CapaLogica/Utilitarios/Utilitarios.h"

#define DEFAULT_MIN_LEN 1
#define DEFAULT_MAX_LEN 500

using std::string;

/*
 * Formulario de entrada de datos que va pidiendo al usuario los campos de a uno.
 * Permite configuraciones en el ingreso para cada campo.
 * Los campos se enumeran desde el 0.
 */
class Formulario {
private:
	typedef struct {
		string nombre;  // nombre del campo
		unsigned int minlen;  // cantidad minima de caracteres/numeros
		unsigned int maxlen;  // cantidad maxima de caracteres/numeros
		bool esNumero;  // fuerza que el valor sea un numero
		bool consultar;  // se consulta al usuario si desea ingresarlo
		int dependencia;  // solo se lo muestra si se ingresó otro campo antes
	} Campo;

	std::vector<Campo*> campos;
	std::map<int,string> valores;

public:
	Formulario(string nombreCampos);
	~Formulario();

	void setAtributos(int campo, int min, int max,
	bool esNum=false, bool consul=false, int depen=-1);
	void setLongitudMin(int campo, int min);
	void setLongitudMax(int campo, int max);
	void setValorNumerico(int campo, bool esNum);
	void setConsultarIngreso(int campo, bool consultar);
	void setDependenciaDeIngreso(int campo, int ingresadoAntes);

	void setLongitudesMimimas(int* minlens);
	void setLongitudesMaximas(int* maxlens);

	/*
	 * Muestra de a uno los campos por pantalla y valida los ingresos.
	 * Se puede pedir que se ingrese un campo específico.
	 */
	void pedirDatos(int campo=-1);

	bool seIngresoElCampo(int campo);

	string getDatoAsStr(unsigned int campo);
	int getDatoAsInt(unsigned int campo);
};

#endif /* FORMULARIO_H_ */
